#include <iostream>
using std::cout;
using std::endl;
//可变参数模板
//Arg类型参数包,可以写n个类型
//arg表示函数参数包.可以写n个变量
//...在参数的左边表示的是打包操作
//...在参数的右边表示的是解包操作,会解出一个数据
template <class ...Arg>
void func(Arg ...arg){
    cout << sizeof...(Arg) << endl;
    cout << sizeof...(arg) << endl;

    //就需要进行解包操作
}

void test(){
    func(1, "hello", 3.5, true);
}

//先设置一个无参的出口
void func2(){
    return;
}

//打印可变参数的参数内容
//只要不是传递无参，那么上下两种写法认为是等价的
template <class ...Arg, class T>
void func2(T t, Arg ...arg){
    cout << t << endl;
    cout << typeid(t).name() << endl;
    func2(arg...);
}

#if 0
    func2(1, 2.4, "hello,world", true);---->
        cout << 1 << endl;
        func2(2.4, "hello,world" + true);---->
            cout << 2.4 << endl;
            func2(hello,world, true);------>
                cout << hello,world << endl;
                func2(true);------->设置一个出口
                    cout << true << endl;
                    func2();//可以设置一个出口

#endif

void test2(){
    func2(1, 2.4, "hello,world", true);
    //1给了t，后面的三个给了arg
    //2.4给了t，后面两个给了arg
    //hello,world给了t，后面1个给了arg
    //true给了t，arg为空
}




int main()
{
    test2();
    return 0;
}

